% TUGBOT.STY % Version 0.5; 1.0 expected Nov. 1 1989 % general items \def\makeatletter{\catcode`\@=11 } \makeatletter % used, as in PLAIN, in protected control sequences \ifx\tugstyloaded@\relax\makeatother\initializearticle \endinput\else\let\tugstyloaded@\relax\fi \input tugbot.com % Stuff different from PLAIN, or reiterated for clarity \newlinechar=`\^^J %\def~{\penalty\@M \ } % tie -- this is PLAIN value; it is reset in AMS-TeX \def~{\unskip\nobreak\ \ignorespaces} % AMS-TeX value \normallineskiplimit=1pt \def\,{\ifmmode\mskip\thinmuskip\else$\,$\nobreak\fi} \def \NoParIndent{\parindent=0pt} \newdimen\normalparindent \normalparindent=20pt % plain = 20pt \def \NormalParIndent{\global\parindent=\normalparindent} \NormalParIndent \def\vellipsis{% \leavevmode\kern0.5em \raise1pt\vbox{\baselineskip6pt\vskip7pt\hbox{.}\hbox{.}\hbox{.}} % some things with the same names as in, or reiterated from, AMS-TeX \def \document{} % override an AMS-TeX convention \output{\output@} % for compatibility with LaTeX \def\clearpage{\newpage} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % ***** fonts and friends ***** % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Struts give ascenders and descenders to assist in baseline alignment % (e.g. of adjoining vertical boxes); useful only with text fonts. % \strut is defined in PLAIN . The structure of \strutt is equivalent. \newbox\struttbox \def\strutt{\relax\ifmmode\copy\struttbox\else\unhcopy\struttbox\fi} % Struts are given the following dimensions for use in TUGboat: % \strut = height/depth of parenthesis in current font % (not the same as PLAIN) % \strutt height + depth = \normalbaselineskip, % height = same as \strut % (equivalent to PLAIN \strut ) % The fonts below are sufficient for most ordinary TUGboat production. % Additional titling fonts are defined elsewhere, and occasionally an % extra font will be needed for a particular item (e.g. the device % charts) and defined in that file. % All PLAIN CM fonts. \font\tenrm=cmr10 \font\ninerm=cmr9 \font\eightrm=cmr8 \font\sevenrm=cmr7 \font\sixrm=cmr6 \font\fiverm=cmr5 \font\teni=cmmi10 \skewchar\teni='177 \font\ninei=cmmi9 \skewchar\ninei='177 \font\eighti=cmmi8 \skewchar\eighti='177 \font\seveni=cmmi7 \skewchar\seveni='177 \font\sixi=cmmi6 \skewchar\sixi='177 \font\fivei=cmmi5 \skewchar\fivei='177 \font\tensy=cmsy10 \skewchar\tensy='60 \font\ninesy=cmsy9 \skewchar\ninesy='60 \font\eightsy=cmsy8 \skewchar\eightsy='60 \font\sevensy=cmsy7 \skewchar\sevensy='60 \font\sixsy=cmsy6 \skewchar\sixsy='60 \font\fivesy=cmsy5 \skewchar\fivesy='60 \font\tenex=cmex10 \font\tenbf=cmbx10 \font\ninebf=cmbx9 \font\eightbf=cmbx8 \font\sevenbf=cmbx7 \font\sixbf=cmbx6 \font\fivebf=cmbx5 \font\tentt=cmtt10 \font\ninett=cmtt9 \font\eighttt=cmtt8 \font\tensl=cmsl10 \font\ninesl=cmsl9 \font\eightsl=cmsl8 \font\sevensl=cmsl8 scaled 900 \font\tenit=cmti10 \font\nineit=cmti9 \font\eightit=cmti8 \font\sevenit=cmti7 \font\tenupit=cmu10 \font\tensmc=cmcsc10 \font\tentex=cmtex10 \def \mit{\fam\@ne} \def \cal{\fam\tw@} \def \sy{\cal} % old name % fonts added for TUGboat % TUGboat section heads \font \seventeenssb=cmssbx10 scaled \magstep3 \font \twelvessb=cmssbx10 scaled \magstep1 \font \tenssb=cmssbx10 % For cmss fonts not needed all the time, permit as-needed access \def\LoadSansFonts{% \global\font\twelvess=cmss10 scaled \magstep1 \global\font\tenss=cmss10 \global\font\niness=cmss9 \global\font\eightss=cmss8 \AddToTenPoint{\def\ssf{\tenss}} \AddToNinePoint{\def\ssf{\niness}} \AddToEightPoint{\def\ssf{\eightss}} \gdef\LoadSansFonts{}} \newfam\titlefam \newdimen\titlefontbaselineskip \titlefontbaselineskip=18pt \def \titlefont{\textfont\titlefam=\seventeenssb \scriptfont\titlefam=\twelvessb \scriptscriptfont\titlefam=\tenssb \fam\titlefam \seventeenssb \baselineskip=\titlefontbaselineskip } % Definitions of \tenpoint, \ninepoint, etc. % Planned additions and changes: % Dynamic loading of fonts, probably in groups according to size % Removal of \rm, \bf, etc., from \*point expansions, replacement % by generic \rm, \bf, etc. definitions % Mechanism for switching neatly between serif and sans-serif % Following will allow text to be a bit stretchier than the built-in % setting; TeXbook, page 433, 355 \newdimen\normaltenptstretch \normaltenptstretch=1.6667pt \newdimen\extratenptstretch \extratenptstretch=4pt \def\NormalTenPointSpacing{\fontdimen3\tenrm=\normaltenptstretch \fontdimen3\tenit=\normaltenptstretch} \def\StretchyTenPointSpacing{\fontdimen3\tenrm=\extratenptstretch \fontdimen3\tenit=\extratenptstretch} \newskip\ttglue \def\setttglue{\tt \global\ttglue=.5em plus .25em minus .15em} \def \tenpoint{\normalbaselineskip=12pt % \def\pointsize@AmS{t} \abovedisplayskip=3pt plus 3pt minus 1pt \belowdisplayskip=3pt plus 3pt minus 1pt \abovedisplayshortskip=0pt plus 3pt \belowdisplayshortskip=1pt plus 3pt minus 1pt \def\rm{\fam\z@\tenrm}% \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm \def\oldstyle{\fam\@ne\teni}% \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex \def\it{\fam\itfam\tenit}% \textfont\itfam=\tenit \scriptfont\itfam=\sevenit \def\sl{\fam\slfam\tensl}% \textfont\slfam=\tensl \scriptfont\slfam=\sevensl \def\bf{\fam\bffam\tenbf}% \textfont\bffam=\tenbf \scriptfont\bffam=\eightbf \scriptscriptfont\bffam=\sixbf \def\smc{\tensmc}% \def\tt{\tentt}% \setttglue \def\upright{\tenupit}% \setbox\strutbox=\hbox{\vrule height7.5pt depth2.5pt width\z@}% \setbox\struttbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}% \normalbaselines \the\@AdditionsToTenPoint \rm } % permit external additions to pointsize definition \newtoks\@AdditionsToTenPoint \def \AddToTenPoint#1{% \@AdditionsToTenPoint=\expandafter{\the\@AdditionsToTenPoint#1}} \tenpoint % initialize -- default font \newdimen\normalnineptstretch \normalnineptstretch=1.5pt \newdimen\extranineptstretch \extranineptstretch=3.6pt \def\NormalNinePointSpacing{\fontdimen3\ninerm=\normalnineptstretch} \def\StretchyNinePointSpacing{\fontdimen3\ninerm=\extranineptstretch} \def \ninepoint{\normalbaselineskip=11pt \abovedisplayskip=2.5pt plus 2.5pt minus 1pt \belowdisplayskip=2.5pt plus 2.5pt minus 1pt \abovedisplayshortskip=0pt plus 2.5pt \belowdisplayshortskip=1pt plus 2.5pt minus 1pt \def\rm{\fam\z@\ninerm}% \textfont0=\ninerm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm \def\oldstyle{\fam\@ne\ninei}% \textfont1=\ninei \scriptfont1=\seveni \scriptscriptfont1=\fivei \textfont2=\ninesy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy \def\it{\fam\itfam\nineit}% \textfont\itfam=\nineit \def\sl{\fam\slfam\ninesl}% \textfont\slfam=\ninesl \def\bf{\fam\bffam\ninebf}% \textfont\bffam=\ninebf \scriptfont\bffam=\sevenbf \scriptscriptfont\bffam=\sixbf \def\smc{\ninesmc}% \def\tt{\ninett}% \setttglue \setbox\strutbox=\hbox{\vrule height 6.75pt depth 2.25pt width\z@}% \setbox\struttbox=\hbox{\vrule height 7.75pt depth 3.25pt width\z@}% \normalbaselines \the\@AdditionsToNinePoint \rm } % this is equivalent to baselineskip = 10pt % \setbox\struttbox=\hbox{\vrule height 7.25pt depth 2.75pt width\z@}% \newtoks\@AdditionsToNinePoint \def \AddToNinePoint#1{% permit external additions to font \@AdditionsToNinePoint=\expandafter{\the\@AdditionsToNinePoint#1}} \newdimen\normaleightptstretch \normaleightptstretch=1.333pt \newdimen\extraeightptstretch \extraeightptstretch=3pt \def\NormalEightPointSpacing{\fontdimen3\eightrm=\normaleightptstretch} \def\StretchyEightPointSpacing{\fontdimen3\eightrm=\extraeightptstretch} \def \eightpoint{\normalbaselineskip=10pt \abovedisplayskip=2pt plus 2pt minus 1pt \belowdisplayskip=2pt plus 2pt minus 1pt \abovedisplayshortskip=0pt plus 2pt \belowdisplayshortskip=1pt plus 2pt minus 1pt \def\rm{\fam\z@\eightrm}% \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm \def\oldstyle{\fam\@ne\eighti}% \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy % \textfont3=\eightex \scriptfont3=\eightex \scriptscriptfont3=\eightex \def\it{\fam\itfam\eightit}% \textfont\itfam=\eightit \def\sl{\fam\slfam\eightsl}% \textfont\slfam=\eightsl \def\bf{\fam\bffam\eightbf}% \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf \scriptscriptfont\bffam=\sixbf \def\smc{\eightsmc}% \def\tt{\eighttt}% \setttglue \setbox\strutbox=\hbox{\vrule height 6pt depth 2pt width\z@}% \setbox\struttbox=\hbox{\vrule height 7pt depth 3pt width\z@}% \normalbaselines \the\@AdditionsToEightPoint \rm } % this is equivalent to baselineskip = 9pt % \setbox\struttbox=\hbox{\vrule height 6.5pt depth 2.5pt width\z@}% \newtoks\@AdditionsToEightPoint \def \AddToEightPoint#1{% permit external additions to font \@AdditionsToEightPoint=\expandafter{\the\@AdditionsToEightPoint#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % ***** page dimensions ***** % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newdimen\trimlgt \trimlgt=11in % 10.5in (vols 7-9) \newdimen\headmargin \headmargin=3.5pc % 2.5pc (vols 7-9) \newdimen\pagelgt \newdimen\rheadlgt \rheadlgt=2.5pc % + headmargin = 6pc = 1in \newdimen\toplgt \toplgt=0pt \newdimen\normalcollgt \normalcollgt=54pc % 52pc for 5#2 \newdimen\collgt \collgt=\normalcollgt \newdimen\Collgt \maxdepth=2pt \newdimen\botlgt \botlgt=0pt \newdimen\rfootlgt \rfootlgt=2pc \newif\ifThisIsFirstPage \ThisIsFirstPagefalse \def \resetpagelgt{\pagelgt=\collgt \Collgt=\collgt \advance\pagelgt by \rheadlgt \ifThisIsFirstPage \advance\Collgt by-\toplgt \advance\Collgt by-\botlgt \fi \advance\pagelgt by \maxdepth \global\advance\pagelgt by \rfootlgt \global\vsize=\Collgt } \def \resetfpagelgt{\global\ThisIsFirstPagetrue \resetpagelgt } % exclude special first page material \resetpagelgt \raggedbottom \newdimen\colwd \newdimen\pagewd \pagewd=39pc \newdimen\trimwd \trimwd=\pagewd \def \onecol{\colwd=\pagewd \OneCol } \newdimen\onenarrowcolwd \onenarrowcolwd=30pc \def \onenarrow{\colwd=\onenarrowcolwd \OneCol } % before 5#2, `narrow' was 34pc \newdimen\onemediumcolwd \onemediumcolwd=34pc \def \onemedium{\colwd=\onemediumcolwd \OneCol } \newdimen\twocolcolwd \twocolcolwd=18.75pc \def \twocol{\colwd=\twocolcolwd \TwoCol } \newdimen\threecolcolwd \threecolcolwd=12pc \def \threecol{\colwd=\threecolcolwd \ThreeCol } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % ***** headers/footers ***** % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \pagenoprefix{} \def \rtitlex{\def\tubfont{\rm}\TUB, \volx } \def \rtitle{\hbox to \pagewd{\tenrm \makestrut[10pt;\z@]% \ifodd\pageno \rtitlex\qquad\midrtitle\hfil\pagenoprefix\number\pageno \else \pagenoprefix\number\pageno\hfil\midrtitle\qquad\rtitlex \fi }} \def \runhead{\vbox to \rheadlgt{\rtitle \vfil }} \def \runfoot{% \vbox to \rfootlgt{ \ifnum\xcol=2 \hbox to \pagewd{\makestrut[1.5pc;\z@]\midrtitle\hfil\midrtitle}\fi \vfil }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % ***** output ***** % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % In the absence of automatic column-balancing, provide a mechanism % for manually shortening a specified page. \newif\ifSh@rtPage \Sh@rtPagefalse \newif\ifSh@rtPagePending \Sh@rtPagePendingfalse \newcount\Sh@rtPageNo \newdimen\Sh@rtPageLgt \def\@to{to} \def\@by{by} % #1 = to/by; #2 = \dimen; #3 = ; #4 = * of Shorten*Page \def\@toby#1#2#3#4{\def\@tb{#1}% \ifx \@tb\@to \global #2=#3 \else \ifx \@tb\@by \T@stDimen=#3 % accommodate negative #3 #2=\normalcollgt \global\advance #2 by -\T@stDimen \else \errmessage{#1 is invalid syntax; \string\Shorten#4Page requires "to" or "by"}\fi \fi } \def\@plusno#1#2;{\if +#1\T@stCount=\pageno \advance\T@stCount by #2 \else \T@stCount=#1#2 \fi } \def \ShortenPage #1 #2 #3. {\global\Sh@rtPagePendingtrue % \global\Sh@rtPageNo=#1 \@plusno#1;\global\Sh@rtPageNo=\T@stCount \@toby{#2}{\Sh@rtPageLgt}{#3}{}} \def \ShortenThisPage #1 #2. {\global\Sh@rtPagetrue \@toby{#1}{\vsize}{#2}{This}} % Two cases: 0 = last page was nonstandard; reset \vsize % 1 = do not reset \vsize: okay or length already reset \def \D@EndPage{\global\advancepageno \T@stCount=1 \ifThisIsFirstPage \T@stCount=0 \global\ThisIsFirstPagefalse \resetfirsthead \resetfirstfoot \global\collgt=\normalcollgt \fi \ifSh@rtPage \T@stCount=0 \global\Sh@rtPagefalse \fi \ifSh@rtPagePending \ifnum\pageno = \Sh@rtPageNo \T@stCount=1 \global\vsize=\Sh@rtPageLgt \global\Sh@rtPagePendingfalse \global\Sh@rtPagetrue \fi \fi \ifcase \T@stCount \resetpagelgt \fi } % Add more powerful means of adjusting pages by keeping a list of % commands to be executed prior to making up the next page. This % technique will be expanded in the next version of the output % routine. % "\DelayedCommand \endCommand" % places the token list at the end of a list of "things to do". % At the end of every column, the output routine checks this list to % see whether the head of the list should be "executed" prior to % building the next column. If so, the execution is performed. % Right now, items must be placed in the execution list in order, % and all items for a given column must be combined into a single % token list. % Natural applications are double column figures and column size % adjustments. E.g. % \DelayedCommand +5 1 \global\advance\vsize by 2\baselineskip\endCommand % will increase the \vsize of the first column of the page 5 pages from % "now" by 2 baselines. To pull the \vsize back to normal would require % another use of \DelayedCommand. Double column figures can be achieved % with insertions called by \DelayedCommand. % Right now the technique is messy, but it can be used by those who know % how it's implemented and know its limitations. \newtoks\@DelayedCommandList \def\DelayedCommand #1 #2 #3\endCommand{% \@plusno#1;% \edef\@temp{\the\@DelayedCommandList<\number\T@stCount>}% \global\@DelayedCommandList=\expandafter{\@temp<#2>#3\endCommand}% \def\@FindNextDCPoint <#1><#2>#3\endList{% \def\DCpage{#1}\def\DCcolumn{#2}} \def\FindNextDCPoint{% \edef\@temp{\the\@DelayedCommandList}% \ifx\@temp\empty \def\DCpage{10000}\def\DCcolumn{0}% \else \edef\@form{% \noexpand\@FindNextDCPoint\the\@DelayedCommandList\noexpand\endList}% \@form \fi} \def\@ExecuteNextDC <#1><#2>#3\endCommand#4\endList{% \global\@DelayedCommandList={#4}% #3} \def\ExecuteNextDC{% \FindNextDCPoint \ifnum \pageno=\DCpage \ifnum\xcol=\DCcolumn \edef\@form{% \noexpand\@ExecuteNextDC\the\@DelayedCommandList\noexpand\endList}% \@form \fi \fi} % Distinguish between laser printer output (for proofing and other % general use) and production, which uses a phototypesetter. \newif\ifLaser \Lasertrue % Registration marks \def \HorzR@gisterRule{\vrule height 0.2pt depth 0pt width 0.5in } \def \DownShortR@gisterRule{\vrule height 0.2pt depth 1pc width 0.2pt } \def \UpShortR@gisterRule{\vrule height 1pc depth 0pt width 0.2pt } % ``T'' marks centered on top and bottom edges of paper \def \ttopregister{\dlap{% \hbox to \trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule \HorzR@gisterRule \hfil \HorzR@gisterRule}% \hbox to \trimwd{\hfil \DownShortR@gisterRule \hfil}}} \def \tbotregister{\ulap{% \hbox to \trimwd{\hfil \UpShortR@gisterRule \hfil}% \hbox to \trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule \HorzR@gisterRule \hfil \HorzR@gisterRule}}} \def \topregister{\ttopregister} \def \botregister{\tbotregister} % All pages containing data are formatted by \midpage \def \midpage#1{\vbox{\basezero \ifLaser \hrule height\z@ depth\z@ width\p@ \vskip-\rheadlgt \else \vbox to \trimlgt \bgroup \topregister \vskip \headmargin \fi \vbox to \pagelgt{\basezero \ifnum\xcol=2 \runhead \else \vbox to \rheadlgt{}\fi \ifThisIsFirstPage \firsthead \fi \hbox to \pagewd{#1}% % \vsize applied in \pagebody \ifThisIsFirstPage \firstfoot \fi \vfil % if no depth, avoid underfull box \runfoot }% \ifLaser \else \vfill \botregister \egroup \fi}% \ifnum\xcol=2 \global\xcol=1 \D@EndPage \else \global\xcol=2 \fi \global\advance\spoolno by 1 } % The production version includes trim marks, which are required % on photographic paper, but are unsuitable for laser printer output. % The production version also generates 2 separate .dvi pages for each % logical page; these are overlaid photographically, and allow the % Alphatype to run more efficiently on 2-column pages. % For laser printer output, each page is output as a unit. % set up auxiliary `page numbers' % \pageno = \count0 as used in PLAIN \countdef\xcol=1 \xcol=1 \countdef\spoolno=2 \spoolno=1 \def \newcol{\par\vfill\eject} \newcount\numcols \newif\ifOneColFormat \newbox\SaveP@geBox \def \OneCol{\hsize=\colwd \numcols=1 \gdef\newpage{\par\vfill\eject}% \OneColFormattrue \gdef\output@{% \ifLaser \xcol=2 \shipout\midpage{\hfil\pagebody \hfil}% \else \shipout\midpage{\hfil\pagebody \hfil}% \shipout\vbox to \trimlgt{\basezero \topregister \vskip\headmargin \vbox to \pagelgt{\basezero \runhead \vfill }% \vfill \botregister }% \D@EndPage \global\xcol=1 \global\advance\spoolno by 1 \fi \ExecuteNextDC }} \def \TwoCol{\hsize=\colwd \numcols=2 \gdef\newpage{\par\vfill\eject \ifnum\xcol=2 \null\vfill\eject \fi }% \OneColFormatfalse \gdef\output@{% % use PLAIN's \pagebody instead of \box255 \ifnum\xcol=1 \ifLaser \global\setbox\SaveP@geBox=\vbox{\pagebody}% \global\xcol=2 \else \shipout\midpage{\pagebody \hfil}\fi \else \shipout\midpage{\ifLaser \box\SaveP@geBox \fi \hfil\pagebody }\fi \ExecuteNextDC \ifnum\outputpenalty>-\@MM \else \dosupereject \fi }} % Three-column format is a hack. Collect all column data and % ship it out in the third segment, but conform to the \midpage % convention that \xcol can never be greater than 2. \newbox\SaveP@geTwoBox \def \ThreeCol{\hsize=\colwd \numcols=3 \gdef\newpage{\par\vfill\eject \loop \ifnum\xcol>1 \advance\xcol by 1 \hbox to \hsize{\hfill}\vfill\eject \repeat }% \OneColFormatfalse \gdef\output@{% % use PLAIN's \pagebody instead of \box255 \ifnum\xcol=1 \global\setbox\SaveP@geBox=\vbox{\pagebody}% \global\xcol=2 \else \ifnum\xcol=2 \global\setbox\SaveP@geTwoBox=\vbox{\pagebody}% \global\xcol=3 \else \ifLaser \else \xcol=1 \shipout\midpage {\vbox to \vsize{\null\vfill}}\fi \xcol=2 \shipout\midpage{\box\SaveP@geBox \hfil \box\SaveP@geTwoBox \hfil \pagebody }\fi \fi \ExecuteNextDC \ifnum\outputpenalty>-\@MM \else \dosupereject \fi }} % Reorganize \pagecontents from PLAIN to put footnotes at very % bottom of page, even if \raggedbottom. \def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 \ifr@ggedbottom \kern-\dimen@ \vfil \fi \ifvoid\footins\else % footnote info is present \vskip\skip\footins \footnoterule \unvbox\footins\fi \ifvoid\botins\else \vskip\skip\botins \unvbox\botins\fi } \newif\if@floatable \@floatabletrue \def\nofloat{\@floatablefalse} % redefine \@ins to avoid the \par of PLAIN \def\@ins{\begingroup\setbox\z@\vbox\bgroup} % start a \vbox \newinsert\botins \newif\ifp@ge \newif\if@mid \newif\if@bot \def\topinsert{\@midfalse\p@gefalse\@botfalse\@ins} \def\botinsert{\@midfalse\p@gefalse\@bottrue\@ins} \def\midinsert{\@midtrue\@botfalse\@ins} \def\pageinsert{\@midfalse\@botfalse\p@getrue\@ins} \skip\botins=\z@ \count\botins=1000 \dimen\botins=\maxdimen \def\endinsert{\egroup % finish the \vbox \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@ \advance\dimen@\pagetotal \if@floatable \ifdim\dimen@>\pagegoal\@midfalse\@botfalse\p@gefalse\fi\fi \fi \if@mid \vskip\abovedisplayskip \box\z@ \vskip\belowdisplayskip \@asifbelowdisplay \else\insert\if@bot\botins\else\topins\fi {\penalty100 % floating insertion \if@bot\medskip\nobreak\fi \splittopskip\z@skip \splitmaxdepth\maxdimen \floatingpenalty\z@ \ifp@ge \dimen@\dp\z@ \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero \else \box\z@\fi \if@bot\else\medskip\fi }% \fi\endgroup} % ********************************************************************** % Section titles and separators \newskip\Tabskss \Tabskss=0pt plus 1000pt minus 1000pt \newskip\AboveTitleSkip \AboveTitleSkip=12pt % 10pt plus 2pt minus 2pt \newskip\BelowTitleSkip \BelowTitleSkip=8pt % plus 1pt minus 1pt \setbox\T@stBox=\hbox{\titlefont O} \newdimen\stfontheight \stfontheight=\ht\T@stBox \newdimen\strulethickness \strulethickness=.6pt \newcount\n@stnum \n@stnum=0 \def \sthrule{\hrule height\strulethickness depth 0pt } \def \stvrule{\vrule height 2\stfontheight depth\stfontheight width\strulethickness } \def \sectitlebox #1<{\vbox{\sthrule \hbox to \hsize{\stvrule\hfil #1\hfil\vrule width\strulethickness }% \sthrule }} \def \secsep{\vskip 5\baselineskip} \newif\ifSecTitle \SecTitlefalse \def \sectitle #1<{\par \SecTitletrue \penalty-1000\secsep \n@stnum=0 {\def\\{ }\setbox\T@stBox=\hbox{\titlefont#1}% \ifdim\wd\T@stBox < \hsize \def\result{\unhbox\T@stBox}% \else \def\\{\cr\noalign{\global\advance\n@stnum by 1 }}% \setbox\T@stBox=\vbox{\titlefont \halign{\hfil##\hfil\cr#1\crcr}}% \def\result{\vbox{\unvbox\T@stBox}}\fi % \ifnum\n@stnum=1 \def\stvrule{\vrule height 3.5\stfontheight % depth\stfontheight width\strulethickness }\fi \ifnum\n@stnum>0 \def\stvrule{\T@stDimen=\n@stnum\titlefontbaselineskip \advance\T@stDimen by-\titlefontbaselineskip \advance\T@stDimen by 3.5\stfontheight \vrule height \T@stDimen depth\stfontheight width\strulethickness }\fi \centerline{\sectitlebox \titlefont\result<}}% \nobreak \vskip\baselineskip } %\def \secsep{\vskip\baselineskip % * * * as for TUGboat pre 5#2 % \centerline{\hbox to 180pt{% % \leaders\hbox to 15pt{\hfil\char'052\hfil}\hfill}}% % \vskip2\baselineskip } \def \littlesep{\vskip 3pt plus 1pt minus 1pt \centerline{\hbox to 90pt{\ignorespaces \leaders\hbox to 10pt{\hfil .\hfil}\hfill} }% \vskip 3pt plus 1pt minus 1pt} % ********************************************************************** % General mechanism for tags % Short Form Tagging. % We specify a character (*) to be used as a begin/end delimiter % for the argument to most tags. This code could be copied and % altered a bit to use another character. \newtoks\@activeShortFormDelimiter \def\AstChar{*} {\makeactive\* \gdef\makeastSFD{% \@activeShortFormDelimiter={*}% \edef\@ShortFormDelimiter{\AstChar}% \expandafter\let\expandafter\@@ShortFormDelimiter\AstChar \makeastSFD \let\@plainast=\ast \def\ast{\ifmmode\@plainast\else \AstChar\fi} % Checking ahead. % Often we check ahead to see what course of action to take next. % This is used to check for optional commands, to check for the % short-form delimiter, and to ignore characters in certain % situations. This is just a check; applications must do whatever % is appropriate with the ensuing token. % The following checks the next token against argument #1. If the % two are the same, #2 is executed, otherwise #3. The comparison is % done with \ifx. Since we check ahead with \futurelet, the first % argument must be stored with \let as well. To include the case % where #1 may be a space, we have to go through a small contortion % to \let\@basetoken= that space. \long\def\@checknexttoken #1#2#3{% \def\?{\ifx\@basetoken}% \futurelet\@basetoken\?#1\fi \def\@todo{% \ifx \@nexttoken\@basetoken\def\@next{#2}\else\def\@next{#3}\fi\@next}% \futurelet\@nexttoken\@todo} % Eliminating characters from input. % The following check ahead to see whether the next token is a % token to be parsed from the input stream. \@ignoreall keeps % checking to eliminate all such characters. Argument #2 is % executed afterwards. % The token is removed by defining a control sequence whose % contextual form includes the token. % execute #2 after ignoring (possibly) one occurrence of #1 \long\def\@ignoreone#1#2{% \def\@ignoreform#1{#2}% \@checknexttoken{#1}{\@ignoreform}{#2}% % execute #2 after ignoring all occurrences of #1 \long\def\@ignoreall#1#2{% \def\@ignoreform#1{\@ignoretest}% \def\@ignoretest{\@checknexttoken{#1}{\@ignoreform}{#2}}% \@ignoretest % Particularly useful ignorances % execute #1 after ignoring spaces \def\DeleteOptionalSpaces#1{% \@ignoreall{ }{#1}% % execute #1 after ignoring spaces and \pars \def\DeleteOptionalSpacesandPars#1{% \@ignoreall{ }{\@ignoreall{\par}{#1}}% % execute #1 after ignoring active spaces {\catcode`\ =\active \gdef\DeleteOptionalActiveSpaces#1{\@ignoreall{ }{#1}}% % Checking and reading options. % To check for the next optional argument, the macros must usually look % ahead to the next character, proceding accordingly depending on % whether that character is a [. This check may be suppressed if % the user has executed the \lastoption option. If \@lastoption is % "true" or if the [ is NOT next, the macro goes on to reading any % arguments and executing appropriately. \def\@checkoptions{% \if@lastoption \def\@next{\@executetoend}% \else \def\@next{\@checknexttoken {[}{\@readoptions}{\@executetoend}}% \fi \@next % Default "options" on start-up: macros must examine input to % determine when last option occurs and whether short-form is being used. \newif\if@lastoption \@lastoptionfalse \def\lastoption{\@lastoptiontrue} \newif\if@longform \@longformfalse \def\longform{\@longformtrue} \newif\if@savingargument \@savingargumentfalse \newtoks\enddelim \def\@defaultoptions{% \@lastoptionfalse \@longformfalse \@savingargumentfalse \enddelim=\expandafter{\csname end\CurrentTag\endcsname}% % To read an optional command, \catcodes of \ { } are restored to their plain % values, and the [...] form is parsed out by \@@readoptions. The argument % to \@@readoptions is then executed, the 3 specials are restored and % the we check again for [ after deleting spaces. \def\@readoptions{% \savecat\\\makeescape\\% \savecat\{\makebgroup\{% \savecat\}\makeegroup\}% \@@readoptions} \def\@@readoptions[#1]{% #1% \restorecat\\\restorecat\{\restorecat\}% \DeleteOptionalSpaces{\@checkoptions}% % Reading to the end-tag. % Macros may just do their business after options have been % read. In this case, there is no end-tag to worry about. % Otherwise, the macros either read to the "long-form" of end-tag % (e.g. \endtitle or \endauthor) or pull out the argument delimited % by the short-form delimiter. Unless an option has specified % that the long-form is to be used, the macros look ahead to % see whether the short-form delimiter occurs next. If so, % it is assumed that the short-form is being used. \newcount\@numarguments \@numarguments=1 \def\@executetoend{% \ifnum\@numarguments>0 \if@longform \def\@next{\@longparse}% \else \def\@next{\@checknexttoken {\@@ShortFormDelimiter}{\@shortparse}{\@longparse}}% \fi \else \def\@next{\csname @begin\CurrentTag\endcsname}% \fi \@next % If the short-form is being used, we must define a "form" which % TeX may follow to pull out the tag's argument. This form is % then called, the argument is stored away in the token register % \@argument, and the appropriate end-operation is performed. \newtoks\@argument \def\@shortparse{% \if@savingargument \edef\@form{% \def\noexpand\@@shortparse\@ShortFormDelimiter####1\@ShortFormDelimiter}% \@form{\@argument{##1}\csname end\CurrentTag\endcsname}% \else \expandafter\makeactive\csname\@ShortFormDelimiter\endcsname \expandafter\def\the\@activeShortFormDelimiter {\csname end\CurrentTag\endcsname \expandafter\makeother\csname\@ShortFormDelimiter\endcsname}% \def\@@shortparse{% \expandafter\@ignoreone\expandafter{\@ShortFormDelimiter}% {\csname @begin\CurrentTag\endcsname}% }% \fi \@@shortparse} % On the other hand, if the long form is used, TeX must parse to % the long-form ending tag. Ordinarily we know the ending-tag % because it is just the \end... which corresponds to the tag % which initiated the process. We do allow for the possibility, % however, that we may want to switch this for some reason. E.g. % the different \verbatim styles allow for \verbatim...\endverbatim % and ||...||. The easiest way to implement the || style is % to have the first || call \verbatim and have \verbatim know % to look for || as the end-tag instead of \endverbatim. This may % be accomplished by allowing for the possibility of different % end-tags as below. \def\@longparse{% \if@savingargument \edef\@form{\def\noexpand\@@longparse####1\the\enddelim}% \@form{\global\@argument{##1}\csname end\CurrentTag\endcsname}% \else \def\@@longparse{% \csname @begin\CurrentTag\endcsname }% \fi \@@longparse % ******************************************************** % title, authors, addresses % ***************** % title \def\title{% \begingroup \def\CurrentTag{title}% \@defaultoptions \@savingargumenttrue \@checkoptions} \def\endtitle{% \global\toks@=\expandafter{\the\@argument}% \endgroup \edef\thetitle{\ignorespaces\the\toks@\unskip}% % ***************** % authors \newcount\authornumber \def\author{% \begingroup \def\CurrentTag{author}% \global\advance\authornumber by 1 \@defaultoptions \@savingargumenttrue \@checkoptions} \def\endauthor{% \global\toks@=\expandafter{\the\@argument}% \endgroup \expandafter\edef\csname theauthor\number\authornumber\endcsname {\ignorespaces\the\toks@\unskip}% % ***************** % addresses \def\address{% \begingroup \def\CurrentTag{address}% \@defaultoptions \@savingargumenttrue \let\@addressstyle=\@authorstyle \def\inline{\let\@addressstyle=\@inlinestyle}% \def\display{\let\@addressstyle=\@displaystyle}% \@checkoptions} \def\endaddress{% \ifx\@addressstyle\@inlinestyle \def\\{, }\the\@argument \endgroup \def\@next{}% \else\ifx\@addressstyle\@displaystyle \par\raggedright \everypar={\hangindent 1.5\parindent}% \def\\{\endgraf}% \def\|{\unskip\hfil\break}% \vskip\abovedisplayskip \the\@argument\par \vskip\belowdisplayskip \@asifbelowdisplay \endgroup \def\@next{\ignorespaces}% \else \global\toks@=\expandafter{\the\@argument}% \endgroup \expandafter\edef\csname theaddress\number\authornumber\endcsname {\ignorespaces\the\toks@\unskip}% \def\@next{}% \fi \fi \@next % ***************** % network addresses \def\netaddress{% \begingroup \def\CurrentTag{netaddress}% \@defaultoptions \@savingargumenttrue \let\@network\relax% \def\network##1{\def\@network{##1: }}% \@SpecialsGetOther \netaddrat \netaddrpercent \@checkoptions} {\makeactive\@ \gdef\netaddrat{\makeactive\@\def@{\char"40\discretionary{}{}{}}} \makeactive\% \gdef\netaddrpercent{\makeactive\%\def%{\char"25\discretionary{}{}{}}} % We want the definition of \thenetaddress... to land at the right % nesting level, so we have to first pull it to the top, then % drop back to where we are. \def\endnetaddress{% \global\toks@=\expandafter{\the\@argument}% \ifx\@network\relax \gdef\@@network{}% \else \xdef\@@network{\@network}% \fi \endgroup \expandafter\edef\csname thenetaddress\number\authornumber\endcsname {{\noexpand\rm\@@network}% {\noexpand\netaddrat\noexpand\netaddrpercent\noexpand\net \ignorespaces\the\toks@\unskip}}% \def\net{\tt} % Overrides to default author and signature formats \def\authorlist#1{\def\@authorlist{#1}} \def\signature#1{\def\@signature{#1}} \def\signaturemark{\leavevmode\llap{$\diamond$\enspace}} \def\theauthor#1{\csname theauthor#1\endcsname} \def\theaddress#1{\csname theaddress#1\endcsname} \def\thenetaddress#1{\csname thenetaddress#1\endcsname} \def\@defaultsignature{% \count@=0 \loop \ifnum\count@<\authornumber \medskip \advance\count@ by \@ne \signaturemark \theauthor{\number\count@}\\ \theaddress{\number\count@}\\ \thenetaddress{\number\count@}\\ \repeat \def\makesignature{% \par \rightline{% \vbox{\hsize=12pc \ninepoint \raggedright \parindent \z@ \everypar={\global\hangindent 1pc } \parskip \z@ \netaddrat \netaddrpercent \def\|{\unskip\hfil\break}% \def\\{\endgraf}% \def\net{\tt}% \def\phone{\rm Phone: } \rm \bigskip \@signature}} \newcount\count@@ \def\article{% \@allowspanningfigsfalse \ifSecTitle \global\SecTitlefalse \else \vskip\AboveTitleSkip \kern\topskip \hrule height\z@ depth\z@ width 10pt \kern-\topskip \kern-\strulethickness \hrule height\strulethickness depth\z@ \kern\medskipamount \fi \ifx\thetitle\relax \else \noindent{\def\\{\unskip\hfil\break}\raggedright\bf \ignorespaces\thetitle\unskip\par}% \fi \ifnum\authornumber>0 \nobreak \vskip4pt {\def\\{\unskip\hfil\break}\hangindent\parindent\raggedright \@authorlist\par} \fi \nobreak \vskip \BelowTitleSkip \tenpoint \DeleteOptionalSpacesandPars{\noindent\ignorespaces}% \def\@defaultauthorlist{% \count@=\authornumber \advance\count@ by -2 \count@@=0 \loop \ifnum\count@>0 \advance\count@@ by 1 \ignorespaces\csname theauthor\number\count@@\endcsname\unskip, \advance\count@ by -1 \repeat \count@=\authornumber \advance\count@ by -\count@@ \ifnum\authornumber>0 \ifnum\count@>1 \count@=\authornumber \advance\count@ by -1 \ignorespaces\csname theauthor\number\count@\endcsname\unskip\ and \fi \ignorespaces\csname theauthor\number\authornumber\endcsname\unskip \fi \def\endarticle{\vfil\end} % redefined in drivers % ******************************************************** % Heads. \newcount\headlevel \headlevel=1 \newif\if@removeprewhite \@removeprewhitefalse \newif\if@removepostwhite \@removepostwhitefalse \def\removeprewhite{\@removeprewhitetrue} \def\removepostwhite{\@removepostwhitetrue} \def\head{% \begingroup \def\CurrentTag{head}% \@allowindentfalse \@defaultoptions \@savingargumenttrue \def\\{\break}% \@checkoptions} \def\endhead{% \par \ifcase\headlevel\or \if@removeprewhite\else\vskip\baselineskip\fi \noindent{\raggedright\bf\ignorespaces\the\@argument\unskip\par}% \if@removepostwhite\else\kern0.5\baselineskip\fi \nobreak \gdef\@next{% \if@allowindent\def\@next{}% \else\def\@next{\DeleteOptionalSpacesandPars{\noindent\ignorespaces}}\fi \@next }% \or \if@removeprewhite\else\medskip\fi \noindent{\bf\ignorespaces\the\@argument\unskip.}\hskip0.5em \gdef\@next{\DeleteOptionalSpacesandPars{}}% \or {\bf\ignorespaces\the\@argument\unskip}\hskip0.5em \gdef\@next{\DeleteOptionalSpacesandPars{}}% \fi \endgroup \@next \def\subhead{\head[\headlevel=2]} \def\subsubhead{\head[\headlevel=3]} \newif\if@allowindent \def\allowindent{\global\@allowindenttrue} % ************************************************************************* % Text and subtext. \newcount\textlevel \textlevel=1 \def\text{% \begingroup \def\CurrentTag{text}% \@defaultoptions \@savingargumentfalse \@checkoptions} \def\@begintext{% \par \ifcase\textlevel\or \or \vskip\abovedisplayskip \advance\leftskip by 0.5\parindent \advance\rightskip by 0.5\parindent \ninepoint\rm \fi \def\endtext{% \ifcase\textlevel\or \gdef\@next{}% \or \par \vskip\belowdisplayskip \@asifbelowdisplay \gdef\@next{\ignorespaces}% \fi \endgroup \@next \def\subtext{\text[\textlevel=2]} \def\raggedcenter{% \dimen@=\leftskip \leftskip= 0pt plus 1000pt \advance\leftskip by \dimen@ \dimen@=\rightskip \rightskip= 0pt plus 1000pt \advance\rightskip by \dimen@ \parindent=0pt \parfillskip=0pt % ************************************************************************* % Lists. \newcount\listlevel \listlevel=1 \newif\if@itemized \@itemizedtrue \newif\if@numbered \@numberedfalse \newcount\itemnumber \itemnumber=0 \newif\if@ruled \@ruledfalse \newtoks\@itemtag \@itemtag={$\bullet$} \newcount\@cols \@cols=1 \newdimen\@listindent \newdimen\@listhangindent \newif\if@firstitem \@firstitemtrue \def\@itemseparator{, } \def\tagform#1{\llap{#1\enspace}} \newdimen\outerparindent \def\list{% \begingroup \def\CurrentTag{list}% \let\@liststyle=\@displaystyle \def\inline{\let\@liststyle=\@inlinestyle}% \def\display{\let\@liststyle=\@displaystyle}% \def\displaystyle##1{\def\@altdisplaystyle{##1}}% \def\inlinestyle##1{\def\@altinlinestyle{##1}}% \def\item{% \begingroup \def\CurrentTag{item}% \@numarguments=0 \@checkoptions}% \def\tag##1{\@itemtag{##1}}% \def\unitemized{\@itemizedfalse\@itemtag{}}% \def\numbered{\@itemtag={\number\itemnumber.}}% \def\romannumeraled{\@itemtag={\romannumeral\itemnumber.}}% \def\lettered{\itemnumber="60 \@itemtag={\char\itemnumber.}}% \def\Lettered{\itemnumber="40 \@itemtag={\char\itemnumber.}}% \def\ruled{\@ruledtrue}% \def\cols{\@cols}% \def\itemseparator##1{\def\@itemseparator{##1}}% \@defaultoptions \@savingargumentfalse \@checkoptions} \def\@beginlist{% \ifnum\listlevel=1 \outerparindent=\parindent \fi \ifx\@liststyle\@displaystyle \par \ifnum\listlevel=1 \if@ruled \medskip \hrule\kern5pt \nobreak \else \if@removeprewhite\else\vskip\abovedisplayskip \fi\fi \fi \advance\leftskip by \outerparindent \outerparindent=0.5\outerparindent \@listindent=\outerparindent \@listhangindent=\outerparindent \if@itemized \parindent\@listindent \else \parindent=\z@ \parskip=\z@ \raggedright \everypar={\advance\itemnumber\@ne \tagform{\the\@itemtag}\strutt \hangindent\@listhangindent}% \makeCtrlMendgraf \fi \def\colsep{% \global\count@\itemnumber \egroup \vtop\bgroup \itemnumber=\count@\ignoreendline}% \ifnum\@cols>1 \divide\hsize by\@cols \hbox\bgroup\vtop\bgroup \fi \@altdisplaystyle \else \if@itemized \else \makeCtrlMseparator \advance\itemnumber by \@ne \the\@itemtag\ % \fi \def\colsep{}% \@altinlinestyle \fi \def\endlist{% \ifx\@liststyle\@displaystyle \if@itemized\par\fi \ifnum\@cols>1 \egroup % vtop \egroup % hbox \fi \ifnum\listlevel=1 \nointerlineskip\null \if@ruled \kern5pt\hrule\nobreak\vskip2\medskipamount \else \nobreak \if@removepostwhite\else\vskip\belowdisplayskip\fi \fi \@asifbelowdisplay \fi \else \fi \endgroup % list \def\sublist{\list[\listlevel=2]} \newtoks\everyitem \everyitem{} \def\@beginitem{% \ifx\@liststyle\@displaystyle \par \parindent\z@ \if@firstitem\@firstitemfalse\else\vskip\smallskipamount\fi \advance\itemnumber by \@ne \noindent\leavevmode \the\everyitem \tagform{\the\@itemtag}\strutt \else \def\item{\if@firstitem\@firstitemfalse\else\unskip\@itemseparator\fi \advance\itemnumber by \@ne\the\@itemtag\enspace}% \fi \global\count@\itemnumber \endgroup \itemnumber\count@ % ******************************************************** % Verbatim. % Operation here is very similar to that for the other tags. % The opening tag sets up the situation and looks for optional % commands and the short-form delimiters. Since initial setup % involves changing the special characters to characters of % type other, some juggling must be done when optional commands % are read. In addition, to allow for implementation of the % |...| style using the more verbose \verbatim...\endverbatim, % we parameterize the ending-delimiter. % sets default to display style \def\verbatim{\@verbatim[\display]} \def\@verbatim{% \begingroup \setupverbatim \@checkverboptions \def\setupverbatim{% \def\CurrentTag{verbatim}% \@defaultoptions \def\inline{\global\let\@verbstyle\@inlinestyle}% \def\display{\global\let\@verbstyle\@displaystyle}% \def\displaystyle##1{\def\@altdisplaystyle{##1}}% \def\inlinestyle##1{\def\@altinlinestyle{##1}}% \def\numbered{\@numberedtrue}% \def\ruled{\@ruledtrue}% \@SpecialsGetOther \obeyspaces \obeylines \hyphenpenalty=10000 \the\everyverbatim \def\@authorstyle{\@@@a} \def\@inlinestyle{\@@@i} \def\@displaystyle{\@@@d} \def\@altinlinestyle{} \def\@altdisplaystyle{} \def\@SpecialsGetOther{% \catcode`\\=\other \catcode`\{=\other \catcode`\}=\other \catcode`\$=\other \catcode`\&=\other \catcode`\#=\other \catcode`\%=\other \catcode`\~=\other \catcode`\_=\other \catcode`\^=\other \catcode`\"=\other \catcode`\@=\other \the\@AdditionsToSpecialsGetOther} % The \@Additions... register above should be used whenever another % character is declared to be special for some purpose. E.g., % we will use the | for the short-form |...| verbatim notation. % Since the | is generally active for this purpose, it's category % won't get changed to \other for use in \verbatim...\endverbatim % unless we add it via this mechanism. \newtoks\@AdditionsToSpecialsGetOther \def\AddToSpecialsGetOther#1{% \@AdditionsToSpecialsGetOther= \expandafter{\the\@AdditionsToSpecialsGetOther#1}} % From David Eppstein's ``Trees'' paper (6#1), preserve initial spaces. \def\verbatimspace{\ifvmode\indent\fi\space} {\obeyspaces\gdef\makespaceverbspace{\def {\verbatimspace}}} % Altering the verbatim setup. % Users can alter the setup to their purpose by calling % putting tokens in the register \everyverbatim. \newtoks\everyverbatim \def\@checkverboptions{% \if@lastoption \def\@next{\@executetoendverb}% \else \def\@next{\@checknexttoken {[}{\@readverboptions}{\@executetoendverb}}% \fi \@next \def\@readverboptions{% \savecat\\\makeescape\\% \savecat\{\makebgroup\{% \savecat\}\makeegroup\}% \savecat\ \makespace\ % \savecat\^^M\makeeol\^^M% \@@readverboptions} \def\@@readverboptions[#1]{% #1% \restorecat\\\restorecat\{\restorecat\}% \restorecat\ \restorecat\^^M% \DeleteOptionalActiveSpaces{\@checkverboptions}% \def\@executetoendverb{% \if@longform \def\@next{\@longparseverbatim}% \else \def\@next{\@checknexttoken {\@@ShortFormDelimiter}{\@shortparseverbatim}{\@longparseverbatim}}% \fi \@next \def\@shortparseverbatim{% \edef\@form{% \def\noexpand\@@shortparseverbatim\@ShortFormDelimiter####1\@ShortFormDelimiter}% \@form{\global\@argument{##1}\csname end\CurrentTag\endcsname}% \@ignoreone{\@@ShortFormDelimiter}% {\@ignoreCtrlM{\expandafter\@@shortparseverbatim\@ShortFormDelimiter}% }% \def\@longparseverbatim{% \toks@=\expandafter{\endverbdelimiter}% \edef\@form{\def\noexpand\@@longparseverbatim####1\the\toks@}% \@form{\global\@argument{##1}\endverbatim}% \@ignoreCtrlM{\@@longparseverbatim}} {\catcode`\|=0 \catcode`\\=\other |gdef|endverbdelimiter{\endverbatim}} \def\inputfromvar#1{\def\@verbinputvar{#1}}% \def\inputfromfile#1{\def\@verbinputfile{#1 }}% \let\@verbinputvar\relax \let\@verbinputfile\relax \newif\if@outputtotype \@outputtotypetrue \def\notype{\@outputtotypefalse} \def\outputtovar#1{\def\@verboutputvar{#1}} \def\outputtofile#1{\def\@verboutputfile{#1}} \let\@verboutputvar\relax \let\@verboutputfile\relax \def\endverbatim{% \if@outputtotype \tt \ifx\@verbstyle\@inlinestyle \@beforeverbinline \@altinlinestyle \else \@beforeverbdisplay \@altdisplaystyle \fi \ifx\@verbinputvar\relax\else \csname\@verbinputvar\endcsname \fi \ifx\@verbinputfile\relax\else \input \@verbinputfile \@endverbatim \fi \expandafter\@ignoreendverbatim\the\@argument\@endverbatim \ifx\@verbstyle\@inlinestyle \@afterverbinline \else \@afterverbdisplay \fi \ifx\@verboutputvar\relax\else \expandafter\xdef\csname\@verboutputvar\endcsname{\the\@argument}% \ifx\@verboutputfile\relax\else \immediate\openout\verboutfile=\@verboutputfile \makeCtrlMnewlinechar \immediate\write\verboutfile{\the\@argument}% \immediate\closeout\verboutfile \ifx\@verbstyle\@inlinestyle \gdef\@next{}\else\gdef\@next{\ignorespaces}\fi \endgroup \@next \newwrite\verboutfile % Formatting the text. % \ttrightskip is the permissible overhang beyond right margin; % in MANMAC, this is 5pc, which is fine for the TeXbook, but too much here. \newdimen\ttrightskip \ttrightskip=1pc % Allow for line numbers on a listing as well as rules above and below. \newcount\linenumber \newcount\globallinenumber \globallinenumber = 0 \newif\if@continuingnumbers \@continuingnumbersfalse \def\continuenumbers{\numbered\@continuingnumberstrue} \def\@ignoreendverbatim{\@ignoreone{\@endverbatim}{}} \def\verbendline{\leavevmode\null\endgraf} \def\makeCtrlMactive{\catcode`\^^M=\active} {\makeCtrlMactive \gdef\makeCtrlMverbendline{\def^^M{\makeCtrlMactive% \@ignoreone{\@endverbatim}{\verbendline}}}% \gdef\makeCtrlMverbspace{\makeCtrlMactive\def^^M{\verbatimspace}}% \gdef\makeCtrlMnewlinechar{\newlinechar=`\^^M}% \gdef\makeCtrlMendgraf{\makeCtrlMactive\def^^M{\strutt\endgraf}}% \gdef\makeCtrlMseparator{\makeCtrlMactive% \def^^M{% \@checknexttoken {\endlist}{}{% \@itemseparator\advance\itemnumber by \@ne \the\@itemtag% \unskip\ \ignorespaces}}}% % to read a variable or file name properly, we must interpret % spaces and ^^M as nothing or as spaces {\catcode`\^^M=\active\catcode`\ =\active% \gdef\makeCtrlMempty{\def^^M{}}% \gdef\makespaceempty{\def {}}% {\catcode`\^^M=\active\catcode`\ =\active% \gdef\makeCtrlMspace{\def^^M{\space}}% \gdef\makespacespace{\def {\space}}% {\catcode`\^^M=\active% \gdef\@ignoreCtrlM#1{\@ignoreone{^^M}{#1}}% \gdef\ignoreendline{\@ignoreCtrlM{}}% \def\@beforeverbinline{% \makeCtrlMverbspace \let\@endverbatim=\empty \def\@beforeverbdisplay{% \def\@endverbatim{\verbendline}% \if@ruled \medskip \hrule\kern5pt \nobreak \else \vskip\abovedisplayskip \fi \makespaceverbspace \makeCtrlMverbendline\parskip=\z@ \if@numbered \parindent=\z@ \if@continuingnumbers \else \global\globallinenumber = \z@ \fi \linenumber=\z@ \fi \everypar={\global\advance\globallinenumber by\@ne \advance\linenumber by\@ne \ifnum\linenumber<3 \vadjust{\nobreak}\fi \if@numbered \leavevmode \hbox to\normalparindent{\hss\sevenrm\the\globallinenumber.\ }% \fi}% \frenchspacing\rightskip=-\ttrightskip \def\@afterverbinline{} \def\@afterverbdisplay{% \if@ruled \kern5pt\hrule\nobreak\vskip2\medskipamount \else \nobreak\vskip\belowdisplayskip \fi \@asifbelowdisplay \def\@asifbelowdisplay{% \nobreak \vskip-\parskip \vskip-\abovedisplayshortskip \vskip-2\baselineskip \vskip-\belowdisplayshortskip {\everypar{}\everymath{}$$\null$$}% % Options and variants. \def\verbinline{\verbatim[\inline]} \def\verbdisplay{\verbatim[\display]} \def\verbfile#1{\verbatim[\inputfromfile{#1}]} % Verbatim with the other characters (e.g. |...|). % Procedures are made abstract so that it is easy to allow % different characters to perform this function. Any character % that's chosen could cause problems if it occurs unexpectedly % in the middle of what is supposed to be verbatim text. We call % the current special character for this purpose the "verbchar" % and store it in active form in the token register \@verbchar. \newtoks\@verbchar % On hitting a "verbchar" in the middle of text, TeX must look ahead % to see whether the verbchar occurs again. Since this % look-ahead fixes the category of the token examined, we must change % the categories of all characters appropriately before looking. % We must also "gobble" the second verbchar if we hit one. % Depending upon whether 1 or 2 verbchars are found, we call % \verbatim with the appropriate style command. We also use an % optional command to change the delimiter which ends this \verbatim % block. \def\@firstverbchar{% \begingroup \@SpecialsGetOther \makeverbcharactive \expandafter\@checknexttoken\expandafter{\the\@verbchar}% {\expandafter\@ignoreone\expandafter{\the\@verbchar}% {\endgroup\verbatim[\longform\maketwoendverb]}}% {\endgroup\verbatim[\inline\longform\makeoneendverb]}% \def\setupverbchar{% \def\makeoneendverb{\catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname= \active\edef\endverbdelimiter{\the\@verbchar}}% \def\maketwoendverb{\catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname= \active\edef\endverbdelimiter{\the\@verbchar\the\@verbchar}}% \expandafter\let\the\@verbchar\@firstverbchar \makeverbcharactive \AddToSpecialsGetOther{% \catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname=\other} \def\makeverbcharactive{% \catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname=\active {\makeother\| \gdef\VertChar{|}} {\makeactive\| \gdef\makevertverbchar{% \@verbchar={|}% \setupverbchar {\makeother\! \gdef\WowChar{!}} {\makeactive\! \gdef\makewowverbchar{% \@verbchar={!}% \setupverbchar \def\MTH{$} \def\sb{_} \def\sp{^} \def\SP{{\tt\char"20 }} % "visible" space \chardef\bs=`\\ \def\vrt{{\tt\char`\|}} \def\brokenvert{\hbox to 5.24998pt{\hfill \lower 1.5pt\vbox to 8.5pt{\hrule width .9pt height 3.25pt \vfill\hrule width .9pt height 3.25pt}\hfill}} \def\@lt{$<$} \def\@gt{$>$} {\makeactive\< \gdef\enablemetacode{\makeactive\<\def<##1>{% $\langle${\it\makeCtrlMspace\makespacespace##1\/}$\rangle$}}} % ************************************************************************ % Figures. \newif\if@@mid \@@midfalse \newif\if@@bot \@@botfalse \def\@caption{} \newif\if@fixed \@fixedfalse % items for top and bottom ``banners'' on first page \def \resetfirsthead{\global\toplgt=\z@ \gdef\firsthead{}} \resetfirsthead \newbox\firsth@@d \newbox\firsth@ad \def \resetfirstfoot{\global\botlgt=\z@ \gdef\firstfoot{}} \resetfirstfoot \newbox\firstf@@t \newbox\firstf@ot \newif\if@allowspanningfigs \newcount\@figurepage \newcount\@figurescol \newcount\@figureecol \def\figure{% \begingroup \def\CurrentTag{figure}% \@defaultoptions \@savingargumentfalse \def\top{}% \def\bot{\@@bottrue}% \def\mid{\@@midtrue}% \def\caption##1{\def\@caption{\ulap{\bigskip##1\smallskip}}}% \def\fixed{\@fixedtrue}% \def\scol{\@figurescol}% \def\ecol{\@figureecol}% \@figurepage=\pageno \@figurescol=1 \@figureecol=\numcols \def\page{% \@ignoreall{\space}% {\@ignoreone{=}% {\@ignoreall{\space}% {\@checknexttoken{+}{\@ignoreone{+}{\advance\@figurepage by}}% {\@figurepage=}% }% }% }% }% \@checkoptions} \def\@beginfigure{% \if@fixed \global\ThisIsFirstPagetrue \setbox\T@stBox=\vbox\bgroup \hsize\pagewd \else \if@@mid\midinsert\else\if@@bot\botinsert\else\topinsert\fi\fi \fi \def\endfigure{% \@caption \if@fixed \egroup \if@allowspanningfigs \ifnum\@figurepage>\pageno \immediate\write\sixt@@n{^^J Setting multiple column figures currently not allowed on pages^^J other than the first of each article. Check your source file.^^J}% \else \if@@bot \ifdim \botlgt=\z@ \global\botlgt=\ht\T@stBox \resetpagelgt \fi \global\setbox\firstf@ot=\vbox to \botlgt{\box\T@stBox \vfil}% \global\setbox\firstf@@t=\vbox to \botlgt{\vfil}% \gdef\firstfoot{\ifnum \xcol=2 \copy\firstf@ot \else \copy\firstf@@t \fi }% \else \ifdim \toplgt=\z@ \global\toplgt=\ht\T@stBox \resetpagelgt \fi % assume that \firsth@ad ends with glue, hence no \dp \global\setbox\firsth@ad=\vbox to \toplgt{\box\T@stBox \vfil}% \global\setbox\firsth@@d=\vbox to \toplgt{\vfil}% \gdef\firsthead{\ifnum \xcol=2 \box\firsth@ad \else \copy\firsth@@d \fi }% \fi \fi \else \immediate\write\sixt@@n{^^J Setting multiple column figures currently not allowed after^^J article has begun.^^J}% \fi \else \endinsert \fi \endgroup \def\twocolfigure{% \figure[\fixed]} % Avoid Spanish punctuation ligatures ?` and !`. {\catcode`\`=\active \gdef`{\relax\lq}} % Define a structure that will permit a list (using \obeylines) % to be made into 2 columns, split by \vsplit, indented the % normal \parindent \def \NormalizeBlockHeight{\TestCount=1 % \@ne \TestDimen=\dimen0 \advance\TestDimen by-\topskip \CutOneLine } \def \CutOneLine{\advance\TestCount by 1 \advance\TestDimen by-\baselineskip \ifdim\TestDimen < \baselineskip % \@ne \def\result{\TestDimen=\baselineskip \multiply\TestDimen by \TestCount \advance\TestDimen by \topskip \global\dimen0=\TestDimen }% \else \def\result{\CutOneLine }\fi \result } \def \twosplit{{\topskip=\baselineskip \splittopskip=\topskip \setbox0=\copy\TestBox \dimen0=\ht\TestBox \NormalizeBlockHeight \divide\dimen0 by 2 \setbox\LeftHalf=\vsplit\TestBox to \dimen0 \ifdim\ht\TestBox > \ht\LeftHalf \advance\dimen0 by \baselineskip \setbox\TestBox=\copy0 \setbox\LeftHalf=\vsplit\TestBox to \dimen0 \fi \line{\kern\parindent\valign{##\vfil\cr \unvbox\LeftHalf\cr\noalign{\hfil}\unvbox\TestBox\cr}}}% \global\setbox0=\null} \newbox\LeftHalf \newdimen\HalfWd \HalfWd=\twocolcolwd \advance\HalfWd by-\normalparindent \divide\HalfWd by 2 {\obeylines \gdef\twouplist #1{\topskip=\baselineskip \splittopskip=\topskip % \begingroup \parindent=0pt \obeylines % next line ends with intentional \def\endtwouplist{ \egroup % % end of \vbox \endgroup % % end of \obeylines group \twosplit }% \global\setbox\TestBox=\vbox\bgroup\hsize=\HalfWd % \indent\vrule height\topskip width 0pt #1}% % Tags for special formatting of editor's notes, meeting % attendees lists, etc. (See also TUGBOT.COM) \def \Editor{\noindent To the Editor:\par} \def \EdNote #1{\if #1[\unskip\hskip1em [\thinspace\xEdNote\ignorespaces \else \ifFirstPar \else \medskip\noindent \fi \xEdNote #1\fi } \def \Attendee #1 {\par \noindent\hangindent 2\normalparindent \hbox to .5\normalparindent{\hfil #1\thinspace}\ignorespaces} % Footnotes are mainly supported by PLAIN format, with these % exceptions. \skip\footins=12pt % full blank line % 24pt \def\footnoterule{\kern-8pt \hrule width 5pc \kern 7.6pt } % the \hrule is .4pt high \newif\ifDelayFirstPar \DelayFirstParfalse \def\vfootnote#1{\ifFirstPar \DelayFirstPartrue \fi \insert\footins\bgroup \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \eightpoint\rm \parindent=\normalparindent % always indent footnotes; added for TUGboat \textindent{#1}\footstrut\futurelet\next\fo@t} \def\@foot{\strut\egroup \ifDelayFirstPar \SetupFirstPar \global\DelayFirstParfalse \fi } \newif\ifFirstPar \FirstParfalse \def\SetupFirstPar{\global\parindent=0pt \global\FirstPartrue } % Draw a box around a whole page, e.g. announcements page; % format must be \onenarrow or \onemedium, and start on a new page. \def \bigbox{\hrule \hbox\bgroup \vrule\kern 1pc \vbox\bgroup \vskip 1pc } \def \endbox{\endgraf \vskip 1pc \egroup \kern 1pc\vrule \egroup \hrule } % Macros to produce extra running heads for stripping onto pages % received as camera copy. Format must be preset to \OneCol, and % start on a new page. % Generate 5 (4 + normal running head) per page. \def \DrawT@pLines{\vskip\topskip \ulap{\line{\raise 1ex\rlap{\leaders\hrule\hskip\pagewd}% \leaders\hrule\hfill}}\medskip} \def \r@nhead{\vbox to .23\vsize{\basezero \hsize=\pagewd \vfil \topregister \vskip\headmargin \runhead \DrawT@pLines }\medskip \advancepageno } \def \nextrunner{% \ifnum\T@stCount>0 \ifnum\T@stCount>5 \TestCount=5 \else\TestCount=\T@stCount \fi \advance\T@stCount by-\TestCount \DrawT@pLines % always one at top of page \loop\ifnum\TestCount>1 \r@nhead \advance\TestCount by\m@ne \repeat \newpage \nextrunner \fi } \def \ExtraRunheads #1, #2.{\T@stCount=#1 \gdef\pageprefix{#2}% % as in A-10 for appendices; not used just now \nextrunner } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % ***** utilities ***** % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \linebreak{\unskip\break} % conflicts with LaTeX definition % ********************************************************************* % Initialization. \def\initializearticle{% \let\thetitle=\relax \authornumber=0 \def\@signature{\@defaultsignature}% \def\@authorlist{\@defaultauthorlist}% \@allowspanningfigstrue \makeother\@ % @ is prohibited in AMS-TeX, but should not be in TUGboat \twocol \Lasertrue \PrelimDrafttrue \initializearticle \pageno=1001 % number of title page \StretchyTenPointSpacing \StretchyNinePointSpacing \StretchyEightPointSpacing \makevertverbchar \endinput